package main

import (
	"fmt"
	"strconv"
)

/**
strconv包实现了基本数据类型与其字符串表示的转换，主要有以下常用函数： Atoi()、Itia()、parse系列、format系列、append系列。更多函数请查看官方文档。
下面列举平时编程中用的最多的函数
*/
func main() {

	/**
	一. string与int类型转换

		① Atoi()函数用于将字符串类型的整数转换为int类型；
		② Itoa()函数用于将int类型数据转换为对应的字符串表示；
	*/
	if i, err := strconv.Atoi("100"); err != nil {
		fmt.Println("can't convert to int")
	} else {
		fmt.Printf("type:%T value:%v\n", i, i) //type:int value:100
	}

	s2 := strconv.Itoa(200)
	fmt.Printf("type:%T value:%v\n", s2, s2) //type:string value:"200"

	/**
		二. Parse系列函数

		Parse类函数用于转换字符串为给定类型的值：ParseBool()、ParseFloat()、ParseInt()、ParseUint()。

		① ParseBool()：func ParseBool(str string) (value bool, err error)
		   返回字符串表示的bool值。它接受1、0、t、f、T、F、true、false、True、False、TRUE、FALSE；否则返回错误；
		② ParseInt()：func ParseInt(s string, base int, bitSize int) (i int64, err error)
		   返回字符串表示的整数值，接受正负号。base指定进制（2到36），如果base为0，则会从字符串前置判断，”0x”是16进制，”0”是8进制，否则是10进制；
		   bitSize指定结果必须能无溢出赋值的整数类型，0、8、16、32、64 分别代表 int、int8、int16、int32、int64；返回的err是*NumErr类型的，
		   如果语法有误，err.Error = ErrSyntax；如果结果超出类型范围err.Error = ErrRange；
		③ ParseUnit()：func ParseUint(s string, base int, bitSize int) (n uint64, err error)
		   ParseUint类似ParseInt但不接受正负号，用于无符号整型；
		④ ParseFloat()：func ParseFloat(s string, bitSize int) (f float64, err error)
	       解析一个表示浮点数的字符串并返回其值。如果s合乎语法规则，函数会返回最为接近s表示值的一个浮点数（使用IEEE754规范舍入）。bitSize指定了
		   期望的接收类型，32是float32（返回值可以不改变精确值的赋值给float32），64是float64；返回值err是*NumErr类型的，语法有误的，
		   err.Error=ErrSyntax；结果超出表示范围的，返回值f为±Inf，err.Error= ErrRange；
	*/

	if b, err := strconv.ParseBool("true"); err == nil {
		fmt.Printf("%t\n", b)
	}
	if b, err := strconv.ParseBool("1"); err == nil {
		fmt.Printf("%t\n", b)
	}
	if f, err := strconv.ParseFloat("3.1415", 64); err == nil {
		fmt.Printf("%f\n", f)
	}
	if i, err := strconv.ParseInt("-2", 10, 64); err == nil {
		fmt.Printf("%d\n", i)
	}
	if i, err := strconv.ParseInt("E", 16, 64); err == nil {
		fmt.Printf("%d\n", i)
	}
	if u, err := strconv.ParseUint("2", 10, 64); err == nil {
		fmt.Printf("%d\n", u)
	}

}
